package com.gk.panda.apis.patrol.commons;

import lombok.extern.slf4j.Slf4j;
import org.springframework.aop.interceptor.AsyncUncaughtExceptionHandler;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.AsyncConfigurer;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;

import java.lang.reflect.Method;
import java.util.concurrent.Executor;
import java.util.concurrent.ThreadPoolExecutor;

/**
 * @Author：xxz
 * @Create: 2022/11/18 14:00
 */
@Slf4j
@EnableAsync
@Configuration
public class AsyncConfig implements AsyncConfigurer {
  @Override
  public Executor getAsyncExecutor() {
    ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
    executor.setCorePoolSize(10); //核心线程数
    executor.setMaxPoolSize(50);  //最大线程数
    executor.setQueueCapacity(1000); //队列大小
    executor.setKeepAliveSeconds(300); //线程最大空闲时间
    executor.setThreadNamePrefix("async-Executor-"); //指定用于新创建的线程名称的前缀。
    executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); // 拒绝策略（一共四种，此处省略）

    executor.initialize();
    return executor;
  }

  // 异常处理器
  @Override
  public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
    return new AsyncUncaughtExceptionHandler() {

      @Override
      public void handleUncaughtException(Throwable arg0, Method arg1, Object... arg2) {
        log.error("=========================="+arg0.getMessage()+"=======================", arg0);
        log.error("exception method:"+arg1.getName());
      }
    };
  }
}
